/*
 * fonctionsTCP.c
 *
 *  Created on: 8 mars 2013
 *      Author: alex
 */

#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

int socketClient( char* nomMachine, ushort nbPort ){
	int sock;
	int err;
	struct sockaddr_in nom;
	struct hostent*    host;
	int size_addr_in = sizeof(struct sockaddr_in);

	/*
	 * creation d'une socket, domaine AF_INET, protocole TCP
	 */
	sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock < 0) {
		perror("client : erreur sur la creation de socket");
		return -1;
	}

	/*
	 * initialisation de l'adresse de la socket
	 */
	nom.sin_family = AF_INET;
	bzero(nom.sin_zero, 8);
	nom.sin_port = htons(nbPort);

	/* recherche de l'adresse de la machine */
	host = gethostbyname (nomMachine);
	if (host == NULL) {
		printf("client : erreur gethostbyname %d\n", errno);
		return -2;
	}

	/* recopie de l'adresse IP */
	nom.sin_addr.s_addr = ((struct in_addr *) (host->h_addr_list[0]))->s_addr;

	/* recopie de l'adresse IP */
	nom.sin_addr.s_addr = ((struct in_addr *) (host->h_addr_list[0]))->s_addr;

	/*
	 * connection au serveur
	 */
	err = connect(sock, (struct sockaddr *)&nom, size_addr_in);
	if (err < 0) {
		perror("client : erreur a la connection de socket");
		return -3;
	}
	return sock;
}

int socketServeur(ushort nbPort){
	int socket_s;
	int err;
	int sizeAddr = sizeof(struct sockaddr_in);
	struct sockaddr_in nomConnecte;

	/*
	* creation de la socket, protocole TCP
	*/
	socket_s = socket(AF_INET, SOCK_STREAM, 0);
	if (socket_s < 0) {
		perror("serveurTCP: erreur de socket");
		return -2;
	}

	/*
	* initialisation de l'adresse de la socket
	*/
	nomConnecte.sin_family = AF_INET;
	nomConnecte.sin_port = htons( nbPort ); // conversion en format réseau (big endian)
	nomConnecte.sin_addr.s_addr = INADDR_ANY;
	// INADDR_ANY : 0.0.0.0 (IPv4) donc htonl inutile ici, car pas d'effet
	bzero(nomConnecte.sin_zero, 8);

	/*
	* attribution de l'adresse a la socket
	*/
	err = bind(socket_s, (struct sockaddr *)&nomConnecte, sizeAddr);
	if (err < 0) {
		perror("serveurTCP: erreur sur le bind");
		close(socket_s);
		return -3;
	}

	/*
	* utilisation en socket de controle, puis attente de demandes de
	* connexion.
	*/
	err = listen(socket_s, 1);
	if (err < 0) {
		perror("serveurTCP: erreur dans listen");
		return -4;
	}

	return socket_s;
}
